package com.zhouxiaoxuan13.consumer.feign;

import com.zhouxiaoxuan13.consumer.feign.fallback.LoadBalancerServiceFallback;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

/**
 * 负载均衡测试服务Feign客户端
 * 用于测试OpenFeign的负载均衡功能
 */
@FeignClient(
    name = "promotion-service",           // 服务名称，与Consul中注册的服务名一致
    path = "/api/loadbalancer",          // 服务的基础路径
    fallback = LoadBalancerServiceFallback.class,  // 降级处理类
    contextId = "loadBalancerServiceClient"  // 唯一标识符，避免Bean冲突
)
public interface LoadBalancerServiceClient {

    /**
     * 获取当前服务实例信息
     * 用于测试负载均衡是否正常工作
     * @return 服务实例信息
     */
    @GetMapping("/current-instance")
    ResponseEntity<Map<String, Object>> getCurrentInstance();

    /**
     * 获取服务信息（简化版）
     * @return 服务信息
     */
    @GetMapping("/info")
    ResponseEntity<Map<String, Object>> getInfo();

    /**
     * 获取负载均衡统计信息
     * @return 统计信息
     */
    @GetMapping("/stats")
    ResponseEntity<Map<String, Object>> getStats();

    /**
     * 健康检查端点
     * @return 健康状态
     */
    @GetMapping("/health")
    ResponseEntity<Map<String, Object>> health();

    /**
     * 重置计数器
     * @return 重置结果
     */
    @PostMapping("/reset-counter")
    ResponseEntity<Map<String, Object>> resetCounter();

    // ==================== 熔断器测试接口 ====================

    /**
     * 模拟慢响应（用于测试超时熔断）
     * @param delay 延迟时间（毫秒）
     * @return 响应结果
     */
    @GetMapping("/slow")
    ResponseEntity<Map<String, Object>> slowResponse(@RequestParam(value = "delay", defaultValue = "5000") int delay);

    /**
     * 模拟异常（用于测试异常熔断）
     * @param errorRate 错误率（百分比）
     * @return 响应结果
     */
    @GetMapping("/error")
    ResponseEntity<Map<String, Object>> errorResponse(@RequestParam(value = "errorRate", defaultValue = "50") int errorRate);

    /**
     * 模拟服务不可用（返回503状态码）
     * @return 响应结果
     */
    @GetMapping("/unavailable")
    ResponseEntity<Map<String, Object>> unavailableResponse();
}
